import logging
from pathlib import Path

from fastapi import APIRouter

from app.core.config import DEFAULT_CACHE_DIR
from app.models import CRRequest, CRResponse
from app.utils.common_utils import (
    ProcessingError,
    change_directory,
    determine_soc,
    setup_cache_directory,
    setup_tqc_data,
)
from app.utils.dealfort import run_CR

router = APIRouter()
logger = logging.getLogger(__name__)


async def process_solve_cr(cache_dir: Path, og_number: int | None = None):
    """处理兼容性关系检查"""
    try:
        soc = determine_soc(cache_dir / "tqc.data")
        logger.info(f"确定SOC值: {soc}")

        # 验证OG编号（如果提供了）
        if og_number:
            if og_number <= 0 or og_number > 1651:
                raise ProcessingError(f"OG磁性空间群编号 {og_number} 超出范围(1-1651)")
            if soc == 0:
                raise ProcessingError("自旋指标计算目前仅支持含自旋轨道耦合的数据")
            logger.info(f"使用提供的OG磁性空间群编号: {og_number}")

        with change_directory(cache_dir):
            cr_result, msg = run_CR("tqc.data", soc, og_number)

        response = {
            "status": "success",
            "soc": soc,
            "cr_result": cr_result,
            "conclusion": msg,
        }

        return CRResponse.model_validate(response)
    except ProcessingError:
        raise
    except Exception as e:
        raise ProcessingError(f"CR检查处理中发生意外错误: {str(e)}") from e


@router.post(
    "/solve_cr",
    summary="兼容性关系(CR)检查",
    description="执行拓扑兼容性关系检查，分析材料的拓扑约束和对称性兼容性",
    response_description="返回兼容性关系分析结果",
    response_model=CRResponse,
)
async def compatibility_relations(request: CRRequest):
    """
    ## 兼容性关系(CR)检查分析

    执行拓扑兼容性关系检查，分析材料在给定对称性约束下的拓扑性质和兼容性。

    ### 功能说明：
    - 检查材料的拓扑兼容性关系
    - 分析对称性约束下的拓扑不变量
    - 验证带结构与群论预测的一致性
    - 确定拓扑相的稳定性

    ### 输入参数：
    - **poscar_content**: POSCAR文件的完整内容(可选，用来定位cache目录，如果传了，则cache目录为poscar_content的hash值)
    - **tqc_data**: TQC数据文件内容，包含占据带信息
    - **og_number**: OG磁性空间群编号 (可选，范围：1-1651)
        - 如果提供，将使用指定的磁性空间群进行分析
        - 如果不提供，将自动确定空间群

    ### 返回结果：
    - **status**: 处理状态 ("success" 或 "error")
    - **soc**: 是否包含自旋轨道耦合效应
    - **cr_result**: 详细的兼容性关系检查结果
    - **conclusion**: 分析结论和总结
    """
    cache_dir = setup_cache_directory(request.poscar_content) if request.poscar_content else DEFAULT_CACHE_DIR
    setup_tqc_data(cache_dir, request.tqc_data)
    return await process_solve_cr(cache_dir, request.og_number)
